/* 
 * File:   SingleCommand.h
 * Author: weeteck
 *
 * Created on 12. listopad 2012, 12:42
 */

#ifndef SINGLECOMMAND_H
#define	SINGLECOMMAND_H

#include <iostream>
#include <string>
#include <string.h>
#include <list>

//using std::string;

/**
 * Třída představující jeden příkaz kolony. 
 * Obsahuje informace nezbytné pro správnou interpretaci jako jsou: názvy 
 * souborů, které poslouží při přesměrování deskrptorů, způsob zápisu do těchto 
 * souborů, argumenty spuštění (z příkazové řádky) a jestli bude kolona 
 * provedena na pozadí.
 */
class SingleCommand
{
public:

  /**
   * Statická metoda uvolněje paměť po poli argumentů (v podobě C-string), které
   * vytváří funkce getArgsToArray().
   * 
   * @param args ukazatel na pole řetězců
   * @param nargs počet řetězců
   */
  static void
  destroyArgsArray(char**, int);


  /**
   * Výchozí konstruktor.
   */
  SingleCommand() { }


  /**
   * Výchozí destruktor.
   */
  virtual
  ~SingleCommand() { }


  /**
   * Nataví název souboru pro výstup STDERR.
   * 
   * @param fileErr název souboru
   */
  void
  setFileErr(std::string fileErr) {
    this->fileErr = fileErr;
  }


  /**
   * Vrací název souboru pro výstup STDERR.
   * 
   * @return název souboru
   */
  std::string
  getFileErr() const {
    return fileErr;
  }


  /**
   * Nastaví způsob zápisu. 
   * 
   * @param fileErrAppend True = Append: Do souboru se bude přidávat za konec.
   * False = Truncate: Soubor se přepíše.
   */
  void
  setFileErrAppend(bool fileErrAppend) {
    this->fileErrAppend = fileErrAppend;
  }


  /**
   * Zjistí způsob zápisu.
   * 
   * @return True = Append: Do souboru se bude přidávat za konec.
   * False = Truncate: Soubor se přepíše.
   */
  bool
  isFileErrAppend() const {
    return fileErrAppend;
  }


  /**
   * Nataví název souboru pro výstup STDOUT.
   * 
   * @param fileErr název souboru
   */
  void
  setFileOut(std::string fileOut) {
    this->fileOut = fileOut;
  }


  /**
   * Vrací název souboru pro výstup STDOUT.
   * 
   * @return název souboru
   */
  std::string
  getFileOut() const {
    return fileOut;
  }


  /**
   * Nastaví způsob zápisu. 
   * 
   * @param fileErrAppend True = Append: Do souboru se bude přidávat za konec.
   * False = Truncate: Soubor se přepíše.
   */
  void
  setFileOutAppend(bool fileOutAppend) {
    this->fileOutAppend = fileOutAppend;
  }


  /**
   * Zjistí způsob zápisu.
   * 
   * @return True = Append: Do souboru se bude přidávat za konec.
   * False = Truncate: Soubor se přepíše.
   */
  bool
  isFileOutAppend() const {
    return fileOutAppend;
  }


  /**
   * Nataví název souboru pro vstup STDIN.
   * 
   * @param fileErr název souboru
   */
  void
  setFileIn(std::string fileIn) {
    this->fileIn = fileIn;
  }


  /**
   * Vrací název souboru pro vstup STDIN.
   * 
   * @return název souboru
   */
  std::string
  getFileIn() const {
    return fileIn;
  }


  /**
   * Nastaví způsob provedení příkazu (kolony).
   * 
   * @param inBackground True: Provádění na pozadí. False: Na popředí.
   */
  void
  setInBackground(bool inBackground) {
    this->inBackground = inBackground;
  }


  /**
   * Zjistí způsob provedení příkazu (kolony).
   * 
   * @return True: Provádění na pozadí. False: Na popředí.
   */
  bool
  isInBackground() const {
    return inBackground;
  }


  /**
   * Do seznamu přidá na konec jeden argument.
   * 
   * @param arg argument k přidání
   */
  void
  insertArg(std::string arg) {
    args.push_back(arg);
  }


  /**
   * Smaže odsah seznamu argumentů.
   */
  void
  resetArgs() {
    args.clear();
  }


  /**
   * Vrátí kopii členského seznamu args, který uchovává argumenty příkazu z 
   * příkazové řádky (včetně názvu příkazu).
   * 
   * @return seznam argumentů (včetně názvu příkazu)
   */
  std::list<std::string>
  getArgs() const {
    return args;
  }


  /**
   * Z členského seznamu args, který uchovává argumenty příkazu z příkazové řádky
   * (včetně názvu příkazu), vytvoří pole C-řetězců.
   * 
   * @param stringCount odkaz do kterého uloží počet argumentů
   * @return pole argumentů (včetně názvu příkazu)
   */
  char**
  getArgsToArray(int & stringCount);


  /**
   * Z členského seznamu args, který uchovává argumenty z příkazové řádky
   * (včetně názvu příkazu), vytvoří jeden řetězec.
   * 
   * @return řetězec argumentů (včetně názvu příkazu)
   */
  std::string
  getArgsToString();


  /**
   * Metoda provede kontrolní výpis všech členských proměnných.
   */
  void
  printAll();

private:
  bool inBackground;
  std::list<std::string> args;

  std::string fileIn;
  bool fileOutAppend;
  std::string fileOut;
  bool fileErrAppend;
  std::string fileErr;
};

#endif	/* SINGLECOMMAND_H */

